package com.stone.design.mode.pipeline.netty.pipeline;

import com.stone.design.mode.pipeline.netty.handler.ChannelHandler;

import java.util.concurrent.Executor;

/**
 * pipeline 上可以传播出站事件所以继承了 ChannelOutboundInvoker 接口
 * pipeline 上可以传播入站事件所以继承了 ChannelInboundInvoker 接口
 *
 * @author wenpan 2024/01/21 17:10
 */
public interface ChannelPipeline extends ChannelInboundInvoker, ChannelOutboundInvoker {

    /**
     * 向pipeline上通过尾插法添加handler，头插法的这里不实现
     *
     * @param name     handler的名称
     * @param executor 该handler上的事件由该线程池处理
     * @param handler  handler
     * @return com.stone.design.mode.pipeline.netty.pipeline.ChannelPipeline
     * @author wenpan 2024/1/21 6:25 下午
     */
    ChannelPipeline addLast(String name, Executor executor, ChannelHandler handler);

    /**
     * 向pipeline上通过尾插法添加handler，头插法的这里不实现
     *
     * @param name    handler的名称
     * @param handler handler
     * @return com.stone.design.mode.pipeline.netty.pipeline.ChannelPipeline
     * @author wenpan 2024/1/21 6:25 下午
     */
    ChannelPipeline addLast(String name, ChannelHandler handler);

    //
    // pipeline 需要具有传播入站和出站事件的能力，所以继承了 ChannelInboundInvoker, ChannelOutboundInvoker 这两个接口
    // -----------------------------------------------------------------------------------------------------

    @Override
    ChannelInboundInvoker fireChannelRegistered();

    @Override
    ChannelInboundInvoker fireChannelActive();

    @Override
    ChannelPipeline flush();
}
